/*a tarolt eljarast az uj rab beszurasara fogjuk irni
a lenyeg az hogy egy cellaba csak 4 rab kerulhessen.
tehat megnezzuk hogy van-e olyan cella ahol van hely..
ha van berakjuk oda a rabot.. ha nincs akko letrehozunk
uj cellat.. ha mindig ezt a tarolt eljarast hivjuk meg
a rab beszurasakor.. akkor sose fordul elo hogy tobb
mint 4 rab keruljon egy cellaba..
ha valahonnan pedig kiszabadul egy rab akko legkozelebb oda
fog bekerulni az uj rab... */

alter procedure uj_rab
@szemelyid int,
@buntetes int,
@reszleg int,/*ez a valtozo azt adja meg hogy melyik
reszlegbe hozunk majd letre uj cellat, ha egyik cellaban sincs hely a
rabnak*/
@szam int/*ez az uj cella szama lesz*/
as

declare @kod int,@darab int,@maxkod int,@vege int,@cellakod int

begin transaction
set transaction isolation level serializable

set @vege=0 /*ez egy valtozo ami ellenorzi hogy kaptunk-e cellat
amiko kapunk 1 lesz*/

declare c cursor for
select r.cella_id, count(*) as hany
from rab r,cella c
where r.cella_id=c.id and c.reszleg_id=@reszleg
group by r.cella_id

open c
fetch next from c into @kod,@darab
while @@fetch_status=0
begin

if @darab<4 and @vege=0
begin
set @vege=1
select @maxkod=max(id)+1 from rab
insert into rab values (@maxkod,@szemelyid,@kod,@buntetes)
if @@error<>0 rollback transaction
end

fetch next from c into @kod,@darab

end
close c
deallocate c

if @vege=0
begin

select @cellakod=max(id)+1 from cella
insert into cella values (@cellakod,@szam,@reszleg)
if @@error<>0 rollback transaction

select @maxkod=max(id)+1 from rab
insert into rab values (@maxkod,@szemelyid,@cellakod,@buntetes)
if @@error<>0 rollback transaction

end

commit transaction